const express = require('express');
const router = express.Router();
const { Like, Course, User } = require('../../models');
const { failure, success } = require('../../utils/responses');
const { BadRequest } = require('http-errors');
const { findListPagination, pagination } = require('../../utils/pagination');

router.post('/', async (req, res) => {
  try {
    const { courseId } = req.body;
    if (!courseId) {
      throw new BadRequest('课程ID不能为空。');
    }
    const userId = req.userId;
    const course = await Course.findOne({ where: { id: courseId } });
    if (!course) {
      throw new NotFound(`ID: ${courseId}的课程未找到。`);
    }
    const like = await Like.findOne({ where: { userId, courseId } });
    if (!like) {
      await Like.create({ userId, courseId });
      await course.increment('likesCount');
    } else {
      await like.destroy();
      await course.decrement('likesCount');
    }
    success({ res, message: `${like ? '取消' : '点赞'}成功` });
  } catch (error) {
    failure({ res, error });
  }
});
router.get('/courses', async (req, res) => {
  try {
    // 查询当前用户
    const user = await User.findByPk(req.userId);
    // 在多对多关联的include里，没法用limit这些参数，加上就报错，查询用户点赞的课程列表有可能有很多需要分页。
    // 我们这里没有用include来关联查询对应的课程，而是通过user.getLikeCourses，来查询对应的课程。当我们在模型中定义了likeCourses别名后，在Sequelize获取到的user对象上，就可以调用getLikeCourses方法。
    // 可以看到区别就是在别名前面加了个get。这种做法在Sequelize 关联部分的文档里是有说明的。
    // 这么做的好处，就是可以加上各种参数了，当然包括分页的各种参数了。但这个方法，不能计算一共有多少条记录。所以我们还要计算下总数
    const { pageSize, currentPage, offset } = pagination(req.query);
    const courses = await user.getLikeCourses({
      //增加joinTableAttributes: []，查询关联表的属性是空，也就是关联表什么都不查。
      joinTableAttributes: [],
      attributes: { exclude: ['CategoryId', 'UserId', 'content'] },
      order: [['id', 'DESC']],
      limit: pageSize,
      offset: offset,
    });

    // 查询当前用户点赞过的课程总数
    const count = await user.countLikeCourses();
    success({ res, data: { courses, pagination: { total: count, pageSize, currentPage } } });
  } catch (error) {
    failure({ res, error });
  }
});
module.exports = router;
